Job Market Analysis

An overview of Lombardia job market

Data

 • Activated Contracts from Regione Lombardia

 • Ceased Contracts from Regione Lombardia

 • ATECO Code

 • GeoJSON Lombardia

Data Cleaning

 • Load Datasets

 • Remove Outliers

 • Join with ATECO Code Datasets

 • Manage null values

In [41]:
df_lav_att, df_lav_ces, df_ateco, df_geojson = load_datasets()
df_lav_att
Out[41]:
DATA GENERE ETA SETTOREECONOMICODETTAGLIO TITOLOSTUDIO CONTRATTO MODALITALAVORO PROVINCIAIMPRESA ITALIANO
0 09/05/2020 F 60 Attività di famiglie e convivenze come datori ... NESSUN TITOLO DI STUDIO LAVORO DOMESTICO TEMPO PIENO BERGAMO UCRAINA
1 12/07/2019 M 43 Gestioni di funicolari, ski-lift e seggiovie s... LICENZA MEDIA LAVORO A TEMPO DETERMINATO TEMPO PIENO BERGAMO ITALIA
2 05/06/2013 F 20 Fabbricazione di altre apparecchiature elettri... LICENZA MEDIA APPRENDISTATO PROFESSIONALIZZANTE O CONTRATTO ... TEMPO PIENO BERGAMO ITALIA
3 12/03/2010 F 28 Alberghi DIPLOMA DI ISTRUZIONE SECONDARIA SUPERIORE CH... LAVORO INTERMITTENTE A TEMPO DETERMINATO NON DEFINITO BERGAMO ITALIA
4 06/04/2021 F 49 Rifugi di montagna LICENZA MEDIA LAVORO INTERMITTENTE NON DEFINITO BERGAMO ITALIA
... ... ... ... ... ... ... ... ... ...
9579789 01/03/2020 M 52 Lavori di meccanica generale LICENZA MEDIA LAVORO A TEMPO DETERMINATO TEMPO PIENO BERGAMO ITALIA
9579790 06/09/2010 M 61 Lavori di meccanica generale NESSUN TITOLO DI STUDIO LAVORO A TEMPO INDETERMINATO TEMPO PIENO BERGAMO ALBANIA
9579791 06/11/2021 M 37 Fabbricazione di parti ed accessori per bicicl... NESSUN TITOLO DI STUDIO LAVORO A TEMPO DETERMINATO TEMPO PIENO BERGAMO SENEGAL
9579792 02/02/2010 M 35 Fabbricazione di parti ed accessori per bicicl... LICENZA MEDIA LAVORO INTERINALE (O A SCOPO DI SOMMINISTRAZIO... TEMPO PIENO BERGAMO SENEGAL
9579793 05/07/2012 F 39 Commercio all'ingrosso di abbigliamento e acce... LICENZA MEDIA LAVORO INTERINALE (O A SCOPO DI SOMMINISTRAZIO... NaN BERGAMO ITALIA

9579794 rows × 9 columns

In [42]:
plot_age_distribution(df_lav_att)
In [43]:
plot_age_distribution(df_lav_ces)
In [44]:
plot_time_distribution(df_lav_att, "Activated Contracts")
plot_time_distribution(df_lav_ces, "Ceased Contracts")

Join with ATECO Code Datasets

In [46]:
df_lav_att.groupby(['SETTOREECONOMICODETTAGLIO'])['SETTOREECONOMICODETTAGLIO'].count().to_frame()
Out[46]:
SETTOREECONOMICODETTAGLIO
SETTOREECONOMICODETTAGLIO
Acquacoltura in acqua di mare salmastra o lagunare e servizi connessi 949
Acquacoltura in acque dolci e servizi connessi 545
Affari esteri 723
Affittacamere per brevi soggiorni case ed appartamenti per vacanze bed and breakfast residence 8729
Affitto di aziende 342
... ...
Trattamento igienico del latte 984
Trivellazioni e perforazioni 1599
Università popolare 71
Utilizzo di aree forestali 1277
Villaggi turistici 906

1224 rows × 1 columns

In [48]:
df_lav_att = pd.merge(df_lav_att, df_ateco, how="left", left_on="SETTOREECONOMICODETTAGLIO", right_on="DescrizioneAteco")
df_lav_ces = pd.merge(df_lav_ces, df_ateco, how="left", left_on="SETTOREECONOMICODETTAGLIO", right_on="DescrizioneAteco")
df_lav_att.groupby(['MacroAteco', 'MacroDescrizione'])['MacroAteco'].count().to_frame()
Out[48]:
MacroAteco
MacroAteco MacroDescrizione
A AGRICOLTURA SILVICOLTURA E PESCA 191464
B ESTRAZIONE DI MINERALI DA CAVE E MINIERE 6122
C ATTIVITÀ MANIFATTURIERE 1683362
D FORNITURA DI ENERGIA ELETTRICA GAS VAPORE E ARIA CONDIZIONATA 11992
E FORNITURA DI ACQUA RETI FOGNARIE ATTIVITÀ DI GESTIONE DEI RIFIUTI E RISANAMENTO 30274
F COSTRUZIONI 537945
G COMMERCIO ALLINGROSSO E AL DETTAGLIO RIPARAZIONE DI AUTOVEICOLI E MOTOCICLI 976827
H TRASPORTO E MAGAZZINAGGIO 467976
I ATTIVITÀ DEI SERVIZI DI ALLOGGIO E DI RISTORAZIONE 1264749
J SERVIZI DI INFORMAZIONE E COMUNICAZIONE 713625
K ATTIVITÀ FINANZIARIE E ASSICURATIVE 66430
L ATTIVITÀ IMMOBILIARI 25336
M ATTIVITÀ PROFESSIONALI SCIENTIFICHE E TECNICHE 420783
N NOLEGGIO AGENZIE DI VIAGGIO SERVIZI DI SUPPORTO ALLE IMPRESE 869718
O AMMINISTRAZIONE PUBBLICA E DIFESA ASSICURAZIONE SOCIALE OBBLIGATORIA 87960
P ISTRUZIONE 849114
Q SANITÀ E ASSISTENZA SOCIALE 296441
R ATTIVITÀ ARTISTICHE SPORTIVE DI INTRATTENIMENTO E DIVERTIMENTO 315916
S ALTRE ATTIVITÀ DI SERVIZI 213803
T ATTIVITÀ DI FAMIGLIE E CONVIVENZE COME DATORI DI LAVORO PER PERSONALE DOMESTICO PRODUZIONE DI BENI E SERVIZI INDIFFERENZIATI PER USO PROPRIO DA PARTE DI FAMIGLIE E CONVIVENZE 348738
U ORGANIZZAZIONI ED ORGANISMI EXTRATERRITORIALI 1423

Manage null values

In [49]:
# Activated Contracts
print("Activated Contracts")
missing = df_lav_att.isnull().sum()
percent_missing = df_lav_att.isnull().sum() * 100 / len(df_lav_att)
missing_value_df = pd.DataFrame({ 'Missing': missing, 'Missing %': percent_missing })
missing_value_df
Activated Contracts
Out[49]:
Missing Missing %
DATA 0 0.000000
GENERE 0 0.000000
ETA 0 0.000000
SETTOREECONOMICODETTAGLIO 2881 0.030169
TITOLOSTUDIO 568 0.005948
CONTRATTO 0 0.000000
MODALITALAVORO 439235 4.599527
PROVINCIAIMPRESA 0 0.000000
ITALIANO 0 0.000000
CodAteco 169570 1.775682
DescrizioneAteco 169570 1.775682
MacroAteco 169570 1.775682
MacroDescrizione 169570 1.775682

Manage null values

In [50]:
# Ceased Contracts
print("Ceased Contracts")
missing = df_lav_ces.isnull().sum()
percent_missing = df_lav_ces.isnull().sum() * 100 / len(df_lav_ces)
missing_value_df = pd.DataFrame({ 'Missing': missing, 'Missing %': percent_missing })
missing_value_df
Ceased Contracts
Out[50]:
Missing Missing %
DATA 0 0.000000
GENERE 0 0.000000
ETA 0 0.000000
SETTOREECONOMICODETTAGLIO 1014 0.027346
TITOLOSTUDIO 411 0.011084
CONTRATTO 0 0.000000
MODALITALAVORO 0 0.000000
PROVINCIAIMPRESA 0 0.000000
ITALIANO 0 0.000000
CodAteco 66950 1.805542
DescrizioneAteco 66950 1.805542
MacroAteco 66950 1.805542
MacroDescrizione 66950 1.805542

Data Exploration

In [52]:
plot_diff_att_ces(df_lav_att, df_lav_ces)

Economic Sector Distribution

In [53]:
plot_ateco_barplot(df_lav_att, df_lav_ces)

Geographic Distrution - Activated Contracts

In [54]:
plot_geo_data(df_lav_att, df_geojson, "oranges")

Geographic Distrution - Ceased Contracts

In [55]:
plot_geo_data(df_lav_att, df_geojson, "blues")

Prediction

 • Train and Test Data

 • Statistical Models

 • ML & DL Models

 • Model Evaluation

Train and Test Data

In [56]:
dataset = prepare_dataset(df_lav_att, df_lav_ces)
train, test = get_train_test(dataset, "2009-01", "2016-12", "2017-01", "2019-12")
plot_train_test(train, test)

ARIMA

In [57]:
arima_model = arima(train, test)
MAPE - Mean Absolute Percentage Error: 18.57%

Prophet

In [58]:
prophet_model = prophet(train, test)
23:15:47 - cmdstanpy - INFO - Chain [1] start processing
23:15:47 - cmdstanpy - INFO - Chain [1] done processing
MAPE - Mean Absolute Percentage Error: 18.64%

SVR

In [59]:
svr_model = svr(train, test)
MAPE - Mean Absolute Percentage Error: 8.32%

MLP Regressor

In [60]:
mlp_model = mlp(train, test)
MAPE - Mean Absolute Percentage Error: 12.73%

LSTM

In [61]:
lstm_model = lstm(train, test)
MAPE - Mean Absolute Percentage Error: 12.41%

Prediction Results

In [63]:
plot_prediction(df_plot)

Prediction Results

In [64]:
plot_prediction_and_actual(df_plot)

Prediction Results

In [66]:
mape_on_predictions(df_plot)
ARIMA MAPE : 38.62%
PROPHET MAPE : 46.96%
SVR MAPE : 51.07%
MLP MAPE : 46.79%
LSTM MAPE : 47.14%

Conclusions

 • Evaluation on Test data

 • Evaluation on forecasting 2020 - 2021

 • Work with more historical data

 • Cross Validation and Hyperparameter Tuning

Dashboard

Thanks for your attention!